package com.syp.test.clustercacheflush.dao;

import java.util.Date;
import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import com.syp.test.clustercacheflush.domain.TaskEntity;

/**
 * 
 * @author syp
 * @update 2016年7月14日 上午10:08:21
 */
@Repository
public interface TaskRepository extends JpaRepository<TaskEntity, Long>, JpaSpecificationExecutor<TaskEntity> {

	/**
	 * 根据任务UUID查询任务
	 * 
	 * @param uuid
	 * @return
	 */
	public TaskEntity getByUuid(@Param("uuid") String uuid);
	
	/**
	 * 根据uuid查询任务列表
	 * 
	 * @param applyNo
	 * @return
	 */
	@Query("FROM TaskEntity WHERE uuid IN (:uuidList)")
	List<TaskEntity> getListByUuid(@Param("uuidList") List<String> uuidList);
	
	/**
	 * 安全更新任务状态
	 * 
	 * @param id
	 * @param oldStatus
	 * @param newStatus
	 * @return
	 */
	@Modifying
	@Query("UPDATE TaskEntity SET taskStatus=:newStatus,retryCount=:retryCount,bizTime=:bizTime,lastUpdate=:lastUpdate WHERE id=:id AND taskStatus=:oldStatus")
	public int safeUpdate(@Param("id") Long id, @Param("oldStatus") Integer oldStatus, @Param("newStatus") Integer newStatus, @Param("retryCount") Integer retryCount, @Param("bizTime") Date bizTime, @Param("lastUpdate") Date lastUpdate);

	/**
	 * 安全更新任务状态
	 * 
	 * @param id
	 * @param oldStatus
	 * @param newStatus
	 * @return
	 */
	@Modifying
	@Query("UPDATE TaskEntity SET taskStatus=:newStatus,retryCount=retryCount+:increase,bizTime=:bizTime,lastUpdate=:lastUpdate WHERE id IN (:idList) AND taskStatus=:oldStatus")
	public int batchSafeUpdate(@Param("idList") List<Long> idList, @Param("oldStatus") Integer oldStatus, @Param("newStatus") Integer newStatus, @Param("increase") Integer increase, @Param("bizTime") Date bizTime, @Param("lastUpdate") Date lastUpdate);

}